package AlgoritmosGeneticos.model.impl.selecciones;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import utils.CustomRandom;

import AlgoritmosGeneticos.model.EstrategiaDeSeleccion;
import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.PoblacionSeleccionada;
import AlgoritmosGeneticos.model.impl.PoblacionImpl;
import AlgoritmosGeneticos.model.impl.PoblacionSeleccionadaImpl;

public class Ruleta implements EstrategiaDeSeleccion{

	public Ruleta(){
		super();
		System.out.println("Ruleta");
	}
	
	public Ruleta(String nada){
		super();
	}
	@Override
	public PoblacionSeleccionada seleccionar(List<Individuo> pob, int k) {
		List<Individuo> individuosSeleccionados = new LinkedList<Individuo>();
		List<Double> aptitudes = new ArrayList<Double>();

		double aptitudTotal = 0 ;
	
		for( int i = 0; i < pob.size(); i++){
			double aptitud = PoblacionImpl.aptitud(pob.get(i));
			aptitudes.add(aptitud);
			aptitudTotal += aptitud;
		}
		
		double aptitudAcumulada = 0;
			
		for( int j = 0; j < k; j++){
			double rand = CustomRandom.getInstance().getDoubleRandom();
			aptitudAcumulada = 0;
			for (int i = 0; i < aptitudes.size(); i++){
				
				double limiteinferior = aptitudAcumulada;
				double limitesuperior = aptitudAcumulada + aptitudes.get(i) / aptitudTotal;
				if( rand >= limiteinferior && rand < limitesuperior ){
					individuosSeleccionados.add(pob.get(i));
					break;
				}
				aptitudAcumulada += aptitudes.get(i) / aptitudTotal;
			}
		}
		return new PoblacionSeleccionadaImpl(individuosSeleccionados);
	}
}
